package com.housing.utils;

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import com.zmetaport.common.core.exception.ServiceException;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.UUID;

/**
 * 通用文件上传
 */
public class UploadUtil {


    public static String uploadFile(MultipartFile file) throws Exception {
        // 获取文件原本的名字
        String originName = file.getOriginalFilename();
        String fileType = originName.substring(originName.lastIndexOf(".") + 1);
        // 创建保存路径
        String savePath = getPath(fileType);
        // 保存文件的文件夹
        File folder = new File(savePath);
        // 判断路径是否存在,不存在则自动创建
        if (!folder.exists()) {
            folder.mkdirs();
        }
        file.transferTo(new File(folder, originName));
        return savePath + File.separator + originName;
    }

    public static String getPath(String fileType) {
        return File.separator + "home" + File.separator + "app" + File.separator + "upload" + File.separator + "files" + File.separator + fileType + File.separator + DateUtil.format(new Date(), DatePattern.PURE_DATE_FORMAT) + File.separator + UUID.randomUUID();
    }

    /**
     * Description: 向FTP服务器上传文件
     *
     * @param host          FTP服务器hostname
     * @param port          FTP服务器端口
     * @param username      FTP登录账号
     * @param password      FTP登录密码
     * @param ftpBasePath   FTP服务器基础目录
     * @param ftpTargetPath FTP服务器文件存放路径。ftpBasePath+ftpTargetPath
     * @param fileName      上传到FTP服务器上的文件名
     * @param filePath      输入流
     * @return 成功返回true，否则返回false
     */
    public static boolean uploadFileToFTP(String host, int port, String username, String password, String ftpBasePath,
                                          String ftpTargetPath, String fileName, String filePath) throws Exception {
        FTPClient ftp = initFtpClient(host, port, username, password);
        try {
            //切换到上传目录
            if (!ftp.changeWorkingDirectory(ftpBasePath + ftpTargetPath)) {
                //如果目录不存在创建目录
                String[] dirs = ftpTargetPath.split("/");
                String tempPath = ftpBasePath;
                for (String dir : dirs) {
                    if (null == dir || "".equals(dir)) continue;

                    tempPath += "/" + dir;
                    //进不去目录，说明该目录不存在
                    if (!ftp.changeWorkingDirectory(tempPath)) {
                        //创建目录
                        if (!ftp.makeDirectory(tempPath)) {
                            //如果创建文件目录失败，则返回
                            throw new ServiceException("创建文件目录" + tempPath + "失败");
                        } else {
                            //目录存在，则直接进入该目录
                            ftp.changeWorkingDirectory(tempPath);
                        }
                    }
                }
            }
            //设置上传文件的类型为二进制类型
            ftp.setFileType(FTP.BINARY_FILE_TYPE);
            //上传文件
            FileInputStream in = new FileInputStream(new File(filePath));
            if (!ftp.storeFile(fileName, in)) {
                return false;
            }
            in.close();
            ftp.logout();
        } catch (Exception e) {
            throw e;
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (Exception ioe) {
                    throw ioe;
                }
            }
        }
        return true;
    }


    private static FTPClient initFtpClient(String host, int port, String username, String password) {
        FTPClient ftp = new FTPClient();
        int reply;
        // 连接FTP服务器
        try {
            ftp.connect(host, port);
            // 如果采用默认端口，可以使用ftp.connect(host)的方式直接连接FTP服务器
            // 登录
            ftp.login(username, password);
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                throw new ServiceException("ftp链接失败");
            }
            //将客户端设置为被动模式
            ftp.enterLocalPassiveMode();
        } catch (Exception ex) {
            throw new ServiceException(ex.getMessage());
        }
        return ftp;
    }

    //public static void main(String[] args) {
    //    try {
    //        File file = new File("C:\\Users\\Chen\\Desktop\\c8622c9e76e04378a2bacb591473340e.txt");
    //        byte[] bytes = new byte[(int) file.length()];
    //        InputStream inputStream = Files.newInputStream(file.toPath());
    //        String uuid = UUID.randomUUID().toString().replaceAll("-", StrUtil.EMPTY);
    //        uploadFileToFTP("ftp.penaviconb.com", 21,"zjygadmin", "zjyg-87360135", "SO", uuid + ".txt", inputStream);
    //        System.out.println("上传结束");
    //    } catch (IOException e) {
    //        throw new RuntimeException(e);
    //    }
    //}


    public static boolean uploadFileToFTP(String host, int port, String username, String password, String ftpBasePath, String fileName, InputStream inputStream) throws IOException {
        FTPClient ftp = initFtpClient(host, port, username, password);
        //切换到上传目录
        if (ftp.changeWorkingDirectory(ftpBasePath)) {
            //设置上传文件的类型为二进制类型
            ftp.setFileType(FTP.BINARY_FILE_TYPE);
            if (!ftp.storeFile(fileName, inputStream)) {
                return false;
            }
            inputStream.close();
            ftp.logout();
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (Exception ioe) {
                    throw ioe;
                }
            }
            return true;
        }
        throw new ServiceException("ftp base目录未找不到");
    }

}
